package Juego;


import Controladores.Control_Balas;
import Controladores.Control_Enemigos;
import Controladores.Inteligencia_Enemigo_Principal;
import Frames_juego.GuiJuego;
import Frames_juego.Principal;
import Graficas_capas.grafico_juego;
import Naves.Tanques.MBT_2000;
import Naves.Tanques.Schnell_Tank;
import Naves.Tanques.Tanque;

/**Clase encargada de manejar tanto la parte grafica como las acciones del tanque, y de las entidades participantes
 * 
 * @author Javier Graff
 * @author Eric Avondet
 * @author Rodrigo Herrera
 *
 */
public class Juego 
{
	
	protected Principal frame;
	protected grafico_juego graficas;
	protected GuiJuego gui;
	protected Tanque tanque;
	protected Control_Balas contbalas;
	protected Control_Enemigos enemigos;
	protected Inteligencia_Enemigo_Principal inteligencia;
	protected Thread balas,ene;
	protected boolean en_pausa;
	
	
	/**Constructor
	 * 
	 * @param f frame principal el cual mantiene la pantalla inicial, la pantalla del ganador, etc 
	 * @param dificultad nivel de dificultad del juego 
	 * @param nave numero de nave que usara el jugador
	 */
	public Juego(Principal f, int dificultad, int nave)
	{
		
		
		switch(nave)
		{
			case 1: {
				
				tanque = new MBT_2000(dificultad,this);
				break;
			}
			case 2:{
				
				tanque = new Schnell_Tank(dificultad,this);
				break;
			}
			
			
		}
		
		frame = f;
		frame.setVisible(false);
		graficas = new grafico_juego(this);
		
		graficas.getGraficoInfo().set_energia_max(tanque.getEnergia());
		graficas.getGraficoInfo().setBombas(tanque.cant_bombas());
		
		gui = new GuiJuego(this);
		gui.setVisible(true);
		contbalas = new Control_Balas(this);
		balas = new Thread(contbalas);
		balas.start();
		
		inteligencia = new Inteligencia_Enemigo_Principal(this);
		
		enemigos = new Control_Enemigos(this);
		ene = new Thread(enemigos);
		ene.start();
		en_pausa=false;
		
	}
	
	/**
	 * retorna la inteligencia principal del enemigo
	 * @return
	 */
	public Inteligencia_Enemigo_Principal get_inteligencia()
	{
		return inteligencia;
	}
	

	
	/**
	 * 
	 * @return retorna la clase encargada de manejar los enemigos
	 */
	public Control_Enemigos getcontrolenemigos()
	{
		return enemigos;
	}
	
	/**
	 * 
	 * @return retorna la clase encargada de manejar las balas
	 */
	public Control_Balas getcontrolbalas()
	{
		return contbalas;
	}
	
	/**
	 * 
	 * @return retorna los graficos de los diferentes paneles del juego
	 */
	public grafico_juego getgraficos()
	{
		return graficas;
	}
		
	
	/**
	 * 
	 * @return retorna el tanque del jugador
	 */
	public Tanque getTanque()
	{
		return tanque;
	}

	/**
	 * acciones del juego ante la derrota del jugador
	 */
	public void derrota() 
	{	
		tanque.fin_mov();
		frame.setVisible(true);
		frame.derrota(tanque.getPuntaje(),tanque.get_disp_rec());
		detener_todo();	
	}
	
	/**
	 * acciones del juego ante la victoria del jugador
	 */
	public void victoria()
	{
		tanque.fin_mov();
		frame.setVisible(true);
		frame.victoria(tanque.getPuntaje(), tanque.get_disp_rec());
		detener_todo();
	}

	/**
	 * detiene las ejecuciones paralelas
	 */
	public void detener_todo() 
	{
		contbalas.terminar_hilo();
		enemigos.terminar_hilo();
		graficas.getGraficoPiso().terminarHilo();
		gui.dispose();
	}
	
	/**
	 * pausa el juego
	 */
	public void pausa()
	{
		this.getcontrolenemigos().pausa();
		this.getcontrolbalas().pausa();
		this.getTanque().pausar_mov();
		en_pausa=true;
	}
	
	/**
	 * deja de estar en pausa el juego
	 */
	public void fin_pausa()
	{
		this.getcontrolenemigos().fin_pausa();
		this.getcontrolbalas().fin_pausa();
		this.getTanque().continuar_mov();
		en_pausa=false;
	}
	
	/**
	 * consulta si el juego esta en pausa
	 * @return true si esta en pausa
	 */
	public boolean esta_en_pausa()
	{
		return en_pausa;
	}

}
